home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 23 / CU Amiga - Super CD-ROM 23 (June 1998).iso / CreatingGames / Utilities / Asm / AB3DIIsrc / source_4000 / newAlienControl.s < prev    next >
Encoding:
Text File  |  1996-07-12  |  22.8 KB  |  1,623 lines

  1.  
  2. gotgun: dc.w 0
  3.  
  4. ANIMPOINTER: dc.l 0
  5.  
  6. ASKFORPROT:
  7.  include "ab3:source_4000/askforprot.s"
  8.  
  9. ALIENBRIGHT: dc.w 0
  10.  
  11. ItsAnAlien:
  12.  
  13.  tst.b NASTY
  14.  beq.s .NONASIES
  15.  
  16.  move.l #32*256,StepUpVal
  17.  move.l #32*256,StepDownVal
  18.  
  19. ; move.l #4,deadframe
  20. ; move.w #0,screamsound
  21. ; move.w #160,nasheight
  22.  
  23.  move.w 12(a0),GraphicRoom(a0)
  24.  move.w 12(a0),d2
  25.  bge.s .okalive
  26.  
  27.  
  28.  rts
  29.  
  30.  
  31. .NONASIES:
  32.  move.w #-1,12(a0)
  33.  rts
  34.  
  35. .okalive:
  36.  
  37.  move.l ZoneAdds,a5
  38.  move.l (a5,d2.w*4),d0
  39.  add.l LEVELDATA,d0
  40.  move.l d0,objroom
  41.  
  42.  move.l d0,a6
  43.  move.b ToEcho(a6),ALIENECHO
  44.  
  45.  moveq #0,d0
  46.  move.l LINKFILE,a6
  47.  move.l a6,a5
  48.  move.b TypeOfThing(a0),d0
  49.  add.l #AlienBrights,a5
  50.  move.w (a5,d0.w*2),d1
  51.  neg.w d1
  52.  move.w d1,ALIENBRIGHT
  53.  muls #A_AnimLen,d0
  54.  add.l #AlienAnimData,a6
  55.  add.l d0,a6
  56.  
  57.  move.l a6,ANIMPOINTER
  58.  
  59.  move.l LINKFILE,a1
  60.  move.l a1,a2
  61.  add.l #AlienShotOffsets,a2
  62.  
  63.  lea AlienStats(a1),a1
  64.  moveq #0,d0
  65.  move.b TypeOfThing(a0),d0
  66.  
  67.  move.l (a2,d0.w*8),d1
  68.  asl.l #7,d1
  69.  move.l d1,SHOTYOFF
  70.  move.w 6(a2,d0.w*8),d1
  71.  neg.w d1
  72.  asl.w #2,d1
  73.  move.w d1,SHOTOFFMULT
  74.  
  75.  muls #AlienStatLen,d0
  76.  add.w d0,a1 ; ptr to alien stats
  77.  
  78.  move.w A_Height(a1),d0
  79.  ext.l d0
  80.  asl.l #7,d0
  81.  move.l d0,thingheight
  82.  
  83.  move.w A_Auxilliary(a1),AUXOBJ
  84.  
  85.  move.w (a0),CollId
  86.  
  87.  move.b 1(a1),VECOBJ
  88.  move.w A_ReactionTime(a1),REACTIONTIME
  89.  move.w A_DefBeh(a1),DEFAULTMODE
  90.  move.w A_ResBeh(a1),RESPONSEMODE
  91.  move.w A_RetBeh(a1),RETREATMODE
  92.  move.w A_FolBeh(a1),FOLLOWUPMODE
  93.  move.w A_DefSpeed(a1),prowlspeed
  94.  move.w A_ResSpeed(a1),responsespeed
  95.  move.w A_RetSpeed(a1),retreatspeed
  96.  move.w A_FolSpeed(a1),followupspeed
  97.  move.w A_FolTimeout(a1),FOLLOWUPTIMER
  98.  move.w A_WallCollDist(a1),d0
  99.  move.b diststowall+1(pc,d0.w*4),awayfromwall
  100.  move.w diststowall+2(pc,d0.w*4),extlen
  101.   
  102.  jsr AIROUTINE
  103.  
  104.  rts
  105.  
  106. ALIENECHO: dc.w 0
  107.  
  108. diststowall:
  109.  dc.w 0,40
  110.  dc.w 1,80
  111.  dc.w 2,160
  112.  
  113. ItsAnObject:
  114.  
  115.  move.l LINKFILE,a1
  116.  lea ObjectStats(a1),a1
  117.  moveq #0,d0
  118.  move.b TypeOfThing(a0),d0
  119.  muls #ObjectStatLen,d0
  120.  add.w d0,a1 ; pointer to obj stats.
  121.  
  122.  move.l a1,StatPointer
  123.  
  124.  move.w (a1),d0
  125.  cmp.w #1,d0
  126.  blt Collectable
  127.  beq Activatable
  128.  cmp.w #3,d0
  129.  blt Destructable
  130.  beq Decoration
  131.  
  132.  rts
  133.  
  134. GUNHELD:
  135.  
  136. ; This is a player gun in his hand.
  137.  
  138.  move.l a1,a2
  139.  jsr ACTANIMOBJ
  140.  
  141.  rts
  142.  
  143. Collectable:
  144.  
  145.  move.w 12(a0),d0
  146.  bge.s .okinroom
  147.  rts
  148. .okinroom
  149.  
  150.  tst.b WhichAnim(a0)
  151.  bne.s GUNHELD
  152.  
  153.  move.w d0,GraphicRoom(a0)
  154.  
  155.  tst.b NASTY
  156.  beq.s .nolocks
  157.  move.l DoorsHeld(a0),d1
  158.  or.l d1,DoorLocks
  159. .nolocks:
  160.  tst.b worry(a0)
  161.  bne.s .worryaboot
  162.  rts
  163. .worryaboot:
  164.  
  165.  and.b #$80,worry(a0)
  166.  move.l a1,a2
  167.  
  168.  move.l ZoneAdds,a1
  169.  move.l (a1,d0.w*4),a1
  170.  add.l LEVELDATA,a1
  171.  
  172.  tst.w O_FloorCeiling(a2)
  173.  beq.s .onfloor
  174.  move.l ToZoneRoof(a1),d0
  175.  tst.b ObjInTop(a0)
  176.  beq.s .okinbotc
  177.  move.l ToUpperRoof(a1),d0
  178. .okinbotc:
  179.  
  180.  bra.s .onceiling
  181.  
  182. .onfloor
  183.  move.l ToZoneFloor(a1),d0
  184.  tst.b ObjInTop(a0)
  185.  beq.s .okinbot
  186.  move.l ToUpperFloor(a1),d0
  187. .okinbot:
  188. .onceiling
  189.  
  190.  asr.l #7,d0
  191.  move.w d0,4(a0)
  192.  
  193.  bsr DEFANIMOBJ
  194.  
  195.  bsr CHECKNEARBYONE
  196.  tst.b d0
  197.  beq.s .NotCollected1
  198.  
  199.  bsr PLR1CollectObject
  200.  move.w #-1,12(a0)
  201.  clr.b worry(a0)
  202.  
  203. .NotCollected1
  204.  
  205.  cmp.b #'n',mors
  206.  beq.s .NotCollected2
  207.  bsr CHECKNEARBYTWO
  208.  tst.b d0
  209.  beq.s .NotCollected2
  210.  
  211.  bsr PLR2CollectObject
  212.  move.w #-1,12(a0)
  213.  clr.b worry(a0)
  214.  
  215. .NotCollected2
  216.  
  217.  
  218.  rts
  219.  
  220. Activatable:
  221.  
  222.  move.w 12(a0),d0
  223.  bge.s .okinroom
  224.  rts
  225. .okinroom
  226.  
  227.  tst.b WhichAnim(a0)
  228.  bne ACTIVATED
  229.  
  230.  move.w d0,GraphicRoom(a0)
  231.  tst.b NASTY
  232.  beq.s .nolocks
  233.  move.l DoorsHeld(a0),d1
  234.  or.l d1,DoorLocks
  235. .nolocks
  236.  tst.b worry(a0)
  237.  bne.s .worryaboot
  238.  rts
  239. .worryaboot:
  240.  
  241.  and.b #$80,worry(a0)
  242.  move.l a1,a2
  243.  
  244.  move.l ZoneAdds,a1
  245.  move.l (a1,d0.w*4),a1
  246.  add.l LEVELDATA,a1
  247.  
  248.  tst.w O_FloorCeiling(a2)
  249.  beq.s .onfloor
  250.  move.l ToZoneRoof(a1),d0
  251.  tst.b ObjInTop(a0)
  252.  beq.s .okinbotc
  253.  move.l ToUpperRoof(a1),d0
  254. .okinbotc:
  255.  
  256.  bra.s .onceiling
  257.  
  258. .onfloor
  259.  move.l ToZoneFloor(a1),d0
  260.  tst.b ObjInTop(a0)
  261.  beq.s .okinbot
  262.  move.l ToUpperFloor(a1),d0
  263. .okinbot:
  264. .onceiling
  265.  
  266.  asr.l #7,d0
  267.  move.w d0,4(a0)
  268.  
  269.  bsr DEFANIMOBJ
  270.  
  271.  bsr CHECKNEARBYONE
  272.  tst.b d0
  273.  beq.s .NotActivated1
  274.  
  275.  tst.b p1_spctap
  276.  beq.s .NotActivated1
  277.  
  278. ; The player has pressed the spacebar
  279. ; within range of the object.
  280.  
  281.  bsr PLR1CollectObject
  282.  
  283.  
  284.  move.w #0,ObjTimer(a0)
  285.  st WhichAnim(a0)
  286.  move.w #0,SecTimer(a0)
  287.  rts
  288.  
  289. .NotActivated1:
  290.  
  291.  
  292.  cmp.b #'n',mors
  293.  beq .NotActivated2
  294.  bsr CHECKNEARBYTWO
  295.  tst.b d0
  296.  beq.s .NotActivated2
  297.  
  298.  tst.b p2_spctap
  299.  beq.s .NotActivated2
  300.  
  301. ; The player has pressed the spacebar
  302. ; within range of the object.
  303.  bsr PLR2CollectObject
  304.  
  305.  
  306.  move.w #0,ObjTimer(a0)
  307.  st WhichAnim(a0)
  308.  move.w #0,SecTimer(a0)
  309.  rts
  310.  
  311. .NotActivated2:
  312.  
  313.  rts
  314.  
  315. ACTIVATED:
  316.  
  317.  move.w d0,GraphicRoom(a0)
  318. ; move.l DoorsHeld(a0),d1
  319. ; or.l d1,DoorLocks
  320.  tst.b worry(a0)
  321.  bne.s .worryaboot
  322.  rts
  323. .worryaboot:
  324.  
  325.  and.b #$80,worry(a0)
  326.  move.l a1,a2
  327.  
  328.  move.l ZoneAdds,a1
  329.  move.l (a1,d0.w*4),a1
  330.  add.l LEVELDATA,a1
  331.  
  332.  tst.w O_FloorCeiling(a2)
  333.  beq.s .onfloor
  334.  move.l ToZoneRoof(a1),d0
  335.  tst.b ObjInTop(a0)
  336.  beq.s .okinbotc
  337.  move.l ToUpperRoof(a1),d0
  338. .okinbotc:
  339.  
  340.  bra.s .onceiling
  341.  
  342. .onfloor
  343.  move.l ToZoneFloor(a1),d0
  344.  tst.b ObjInTop(a0)
  345.  beq.s .okinbot
  346.  move.l ToUpperFloor(a1),d0
  347. .okinbot:
  348. .onceiling
  349.  
  350.  asr.l #7,d0
  351.  move.w d0,4(a0)
  352.  
  353.  bsr ACTANIMOBJ
  354.  
  355.  move.w TempFrames,d0
  356.  add.w d0,SecTimer(a0)
  357.  move.w O_ActiveTimeout(a2),d0
  358.  blt.s .nottimeout
  359.  
  360.  cmp.w SecTimer(a0),d0
  361.  ble.s .DEACTIVATE
  362.  
  363. .nottimeout:
  364.  
  365.  bsr CHECKNEARBYONE
  366.  tst.b d0
  367.  beq.s .NotDeactivated1
  368.  
  369.  tst.b p1_spctap
  370.  beq.s .NotDeactivated1
  371.  
  372. ; The player has pressed the spacebar
  373. ; within range of the object.
  374.  
  375. .DEACTIVATE:
  376.  
  377.  move.w #0,ObjTimer(a0)
  378.  clr.b WhichAnim(a0)
  379.  rts
  380.  
  381. .NotDeactivated1:
  382.  
  383.  cmp.b #'n',mors
  384.  beq.s .NotDeactivated2
  385.  
  386.  bsr CHECKNEARBYTWO
  387.  tst.b d0
  388.  beq.s .NotDeactivated2
  389.  
  390.  tst.b p2_spctap
  391.  beq.s .NotDeactivated2
  392.  
  393. ; The player has pressed the spacebar
  394. ; within range of the object.
  395.  
  396.  move.w #0,ObjTimer(a0)
  397.  clr.b WhichAnim(a0)
  398.  rts
  399.  
  400. .NotDeactivated2:
  401.  
  402.  rts
  403.  
  404. Destructable:
  405.  
  406.  move.l LINKFILE,a3
  407.  add.l #ObjectStats,a3
  408.  moveq #0,d0
  409.  move.b TypeOfThing(a0),d0
  410.  muls #ObjectStatLen,d0
  411.  add.l d0,a3
  412.  
  413.  moveq #0,d0
  414.  move.b damagetaken(a0),d0
  415.  cmp.w O_HitPoints(a3),d0
  416.  blt StillHere
  417.  
  418.  tst.b numlives(a0)
  419.  beq.s .alreadydead
  420.  
  421.  cmp.b #'n',mors
  422.  bne.s .notext
  423.  
  424.  move.w TextToShow(a0),d0
  425.  blt.s .notext
  426.  
  427.  muls #160,d0
  428.  add.l LEVELDATA,d0
  429.  jsr SENDMESSAGE
  430. ; move.w #0,SCROLLXPOS
  431. ; move.l d0,SCROLLPOINTER
  432. ; add.l #160,d0
  433. ; move.l d0,ENDSCROLL
  434. ; move.w #40,SCROLLTIMER
  435.  
  436. .notext:
  437.  
  438.  move.w #0,ObjTimer(a0)
  439.  
  440. .alreadydead
  441.  
  442.  move.b #0,numlives(a0)
  443.  
  444.  move.w 12(a0),d0
  445.  bge.s .okinroom
  446.  rts
  447. .okinroom
  448.  
  449.  tst.b worry(a0)
  450.  bne.s .worryaboot
  451.  rts
  452. .worryaboot:
  453.  
  454.  move.l a1,a2
  455.  
  456.  move.l ZoneAdds,a1
  457.  move.l (a1,d0.w*4),a1
  458.  add.l LEVELDATA,a1
  459.  
  460.  tst.w O_FloorCeiling(a2)
  461.  beq.s .onfloor
  462.  move.l ToZoneRoof(a1),d0
  463.  tst.b ObjInTop(a0)
  464.  beq.s .okinbotc
  465.  move.l ToUpperRoof(a1),d0
  466. .okinbotc:
  467.  
  468.  bra.s .onceiling
  469.  
  470. .onfloor
  471.  move.l ToZoneFloor(a1),d0
  472.  tst.b ObjInTop(a0)
  473.  beq.s .okinbot
  474.  move.l ToUpperFloor(a1),d0
  475. .okinbot:
  476. .onceiling
  477.  
  478.  asr.l #7,d0
  479.  move.w d0,4(a0)
  480.  
  481.  bsr ACTANIMOBJ
  482.  
  483.  rts
  484.  
  485. StillHere:
  486.  move.w 12(a0),d0
  487.  bge.s .okinroom
  488.  rts
  489. .okinroom
  490.  move.b #1,numlives(a0)
  491.  
  492.  tst.b NASTY
  493.  beq.s .nolocks
  494.  move.l DoorsHeld(a0),d1
  495.  or.l d1,DoorLocks
  496. .nolocks
  497.  
  498.  tst.b worry(a0)
  499.  bne.s .worryaboot
  500.  rts
  501. .worryaboot:
  502.  
  503.  movem.l d0-d7/a0-a6,-(a7)
  504.  
  505.  move.w 12(a0),d2
  506.  move.l ZoneAdds,a5
  507.  move.l (a5,d2.w*4),d0
  508.  add.l LEVELDATA,d0
  509.  move.l d0,objroom
  510.  
  511.  move.w (a0),d0
  512.  move.l ObjectPoints,a1
  513.  move.w (a1,d0.w*8),newx
  514.  move.w 4(a1,d0.w*8),newz
  515.  
  516.  jsr LOOKFORPLAYER1
  517.  movem.l (a7)+,d0-d7/a0-a6
  518.  
  519. Decoration
  520.  
  521.  move.w 12(a0),d0
  522.  bge.s .okinroom
  523.  rts
  524. .okinroom
  525.  
  526.  tst.b worry(a0)
  527.  bne.s .worryaboot
  528.  rts
  529. .worryaboot:
  530.  
  531.  
  532. intodeco:
  533.  move.l a1,a2
  534.  
  535.  move.l ZoneAdds,a1
  536.  move.l (a1,d0.w*4),a1
  537.  add.l LEVELDATA,a1
  538.  
  539.  tst.w O_FloorCeiling(a2)
  540.  beq.s .onfloor
  541.  move.l ToZoneRoof(a1),d0
  542.  tst.b ObjInTop(a0)
  543.  beq.s .okinbotc
  544.  move.l ToUpperRoof(a1),d0
  545. .okinbotc:
  546.  
  547.  bra.s .onceiling
  548.  
  549. .onfloor
  550.  move.l ToZoneFloor(a1),d0
  551.  tst.b ObjInTop(a0)
  552.  beq.s .okinbot
  553.  move.l ToUpperFloor(a1),d0
  554. .okinbot:
  555. .onceiling
  556.  
  557.  asr.l #7,d0
  558.  move.w d0,4(a0)
  559.  
  560.  bsr DEFANIMOBJ
  561.  
  562.  rts
  563.  
  564. PLR1CollectObject:
  565.  
  566.  cmp.b #'n',mors
  567.  bne.s .nodeftext
  568.  
  569.  move.w TextToShow(a0),d0
  570.  blt.s .notext
  571.  
  572.  muls #160,d0
  573.  add.l LEVELDATA,d0
  574.  jsr SENDMESSAGE
  575. ; move.w #0,SCROLLXPOS
  576. ; move.l d0,SCROLLPOINTER
  577. ; add.l #160,d0
  578. ; move.l d0,ENDSCROLL
  579. ; move.w #40,SCROLLTIMER
  580.  
  581.  bra .nodeftext
  582.  
  583. .notext:
  584.  
  585.  cmp.b #'s',mors
  586.  beq.s .nodeftext
  587.  
  588.  moveq #0,d2
  589.  move.b TypeOfThing(a0),d2
  590.  move.l LINKFILE,a4
  591.  add.l #ObjectNames,a4
  592.  muls #20,d2
  593.  add.l d2,a4
  594.  move.l #TEMPSCROLL,a2
  595.  move.w #19,d2
  596.  
  597. .copyname:
  598.  move.b (a4)+,d3
  599.  bne.s .oklet
  600.  move.b #32,d3
  601. .oklet:
  602.  move.b d3,(a2)+
  603.  
  604.  dbra d2,.copyname
  605.  
  606.  move.l #TEMPSCROLL,d0
  607.  jsr SENDMESSAGENORET
  608.  
  609. .nodeftext:
  610.  
  611.  move.l LINKFILE,a2
  612.  lea AmmoGive(a2),a3
  613.  add.l #GunGive,a2
  614.  moveq #0,d0
  615.  move.b TypeOfThing(a0),d0
  616.  move.w d0,d1
  617.  muls #AmmoGiveLen,d0
  618.  muls #GunGiveLen,d1
  619.  add.w d1,a2
  620.  add.w d0,a3
  621.  
  622. ; Check if player has max of all ammo types:
  623.  
  624.  bsr CHECKPLAYERGOT
  625.  tst.b d0
  626.  beq dontcollect
  627.  
  628.  move.w #21,d0
  629.  move.l #PLAYERONEHEALTH,a1
  630. GiveAmmo:
  631.  move.w (a3)+,d1
  632.  add.w d1,(a1)+
  633.  dbra d0,GiveAmmo
  634.  
  635.  move.w #11,d0
  636.  move.l #PLAYERONESHIELD,a1
  637. GiveGuns:
  638.  move.w (a2)+,d1
  639.  or.w d1,(a1)+
  640.  dbra d0,GiveGuns
  641.  
  642.  move.l LINKFILE,a3
  643.  add.l #ObjectStats,a3
  644.  moveq #0,d0
  645.  move.b TypeOfThing(a0),d0
  646.  muls #ObjectStatLen,d0
  647.  add.l d0,a3
  648.  
  649.  move.w O_SoundEffect(a3),d0
  650.  blt.s .nosoundmake
  651.  
  652.  movem.l d0-d7/a0-a6,-(a7)
  653.  move.w d0,Samplenum
  654.  clr.b notifplaying
  655.  move.w (a0),IDNUM
  656.  move.w #80,Noisevol
  657.  move.l #ObjRotated,a1
  658.  move.w (a0),d0
  659.  lea (a1,d0.w*8),a1
  660.  move.l (a1),Noisex
  661.  jsr MakeSomeNoise
  662.  movem.l (a7)+,d0-d7/a0-a6
  663. .nosoundmake
  664.  
  665.  
  666. dontcollect:
  667.  rts 
  668.  
  669. PLR2CollectObject:
  670.  
  671.  move.l LINKFILE,a2
  672.  lea AmmoGive(a2),a3
  673.  add.l #GunGive,a2
  674.  moveq #0,d0
  675.  move.b TypeOfThing(a0),d0
  676.  move.w d0,d1
  677.  muls #AmmoGiveLen,d0
  678.  muls #GunGiveLen,d1
  679.  add.w d1,a2
  680.  add.w d0,a3
  681.  
  682. ; Check if player has max of all ammo types:
  683.  
  684.  bsr CHECKPLAYERGOT
  685.  tst.b d0
  686.  beq dontcollect2
  687.  
  688.  move.w #21,d0
  689.  move.l #PLAYERTWOHEALTH,a1
  690. GiveAmmo2:
  691.  move.w (a3)+,d1
  692.  add.w d1,(a1)+
  693.  dbra d0,GiveAmmo2
  694.  
  695.  move.w #11,d0
  696.  move.l #PLAYERTWOSHIELD,a1
  697. GiveGuns2:
  698.  move.w (a2)+,d1
  699.  or.w d1,(a1)+
  700.  dbra d0,GiveGuns2
  701.  
  702.  move.l LINKFILE,a3
  703.  add.l #ObjectStats,a3
  704.  moveq #0,d0
  705.  move.b TypeOfThing(a0),d0
  706.  muls #ObjectStatLen,d0
  707.  add.l d0,a3
  708.  
  709.  move.w O_SoundEffect(a3),d0
  710.  blt.s .nosoundmake
  711.  
  712.  movem.l d0-d7/a0-a6,-(a7)
  713.  move.w d0,Samplenum
  714.  clr.b notifplaying
  715.  move.w (a0),IDNUM
  716.  move.w #80,Noisevol
  717.  move.l #ObjRotated,a1
  718.  move.w (a0),d0
  719.  lea (a1,d0.w*8),a1
  720.  move.l (a1),Noisex
  721.  move.b #0,Echo
  722.  jsr MakeSomeNoise
  723.  movem.l (a7)+,d0-d7/a0-a6
  724. .nosoundmake
  725.  
  726.  move.w #-1,12(a0)
  727.  clr.b worry(a0)
  728.  
  729. dontcollect2:
  730.  rts 
  731.  
  732. PLAYERONEHEALTH:
  733.   dc.w 0
  734. PLAYERONEFUEL:
  735.   dc.w 0
  736. PLAYERONEAMMO:
  737.  ds.w 20
  738.  
  739. PLAYERONESHIELD:
  740.  dc.w 0
  741. PLAYERONEJETPACK:
  742.  dc.w 0
  743. PLAYERONEGUNS:
  744.  dcb.w 10,0
  745.  
  746. PLAYERTWOHEALTH:
  747.   dc.w 0
  748. PLAYERTWOFUEL:
  749.   dc.w 0
  750. PLAYERTWOAMMO:
  751.  ds.w 20
  752.  
  753. PLAYERTWOSHIELD:
  754.  dc.w 0
  755. PLAYERTWOJETPACK:
  756.  dc.w 0
  757. PLAYERTWOGUNS:
  758.  dcb.w 10,0
  759.  
  760.   
  761. CHECKPLAYERGOT:
  762.  move.b #1,d0
  763.  rts
  764.  
  765. CHECKNEARBYONE:
  766.  
  767.  move.l StatPointer,a2
  768.  move.b PLR1_StoodInTop,d0
  769.  move.b ObjInTop(a0),d1
  770.  eor.b d0,d1
  771.  bne .NotSameZone
  772.  
  773.  move.w PLR1_xoff,oldx
  774.  move.w PLR1_zoff,oldz
  775.  move.w PLR1_Zone,d7
  776.  
  777.  cmp.w 12(a0),d7
  778.  bne .NotSameZone
  779.  
  780.  move.l PLR1_yoff,d7
  781.  move.l PLR1_height,d6
  782.  asr.l #1,d6
  783.  add.l d6,d7
  784.  asr.l #7,d7
  785.  sub.w 4(a0),d7
  786.  bgt.s .okpos
  787.  neg.w d7
  788. .okpos
  789.  
  790.  cmp.w O_ColBoxHeight(a2),d7
  791.  bgt .NotSameZone
  792.  
  793.  move.w (a0),d0
  794.  move.l ObjectPoints,a1
  795.  move.w (a1,d0.w*8),newx
  796.  move.w 4(a1,d0.w*8),newz
  797.  move.w O_ColBoxRad(a2),d2
  798.  muls d2,d2
  799.  jsr CheckHit
  800.  move.b hitwall,d0
  801.  rts
  802. .NotSameZone
  803.  moveq #0,d0
  804.  rts 
  805.  
  806. CHECKNEARBYTWO:
  807.  
  808.  move.l StatPointer,a2
  809.  move.b PLR2_StoodInTop,d0
  810.  move.b ObjInTop(a0),d1
  811.  eor.b d0,d1
  812.  bne .NotSameZone
  813.  
  814.  move.w PLR2_xoff,oldx
  815.  move.w PLR2_zoff,oldz
  816.  move.w PLR2_Zone,d7
  817.  
  818.  cmp.w 12(a0),d7
  819.  bne .NotSameZone
  820.  
  821.  move.l PLR2_yoff,d7
  822.  move.l PLR2_height,d6
  823.  asr.l #1,d6
  824.  add.l d6,d7
  825.  asr.l #7,d7
  826.  sub.w 4(a0),d7
  827.  bgt.s .okpos
  828.  neg.w d7
  829. .okpos
  830.  
  831.  cmp.w O_ColBoxHeight(a2),d7
  832.  bgt .NotSameZone
  833.  
  834.  move.w (a0),d0
  835.  move.l ObjectPoints,a1
  836.  move.w (a1,d0.w*8),newx
  837.  move.w 4(a1,d0.w*8),newz
  838.  move.w O_ColBoxRad(a2),d2
  839.  muls d2,d2
  840.  jsr CheckHit
  841.  move.b hitwall,d0
  842.  rts
  843. .NotSameZone
  844.  moveq #0,d0
  845.  rts 
  846.  
  847. StatPointer: dc.l 0
  848.  
  849. DEFANIMOBJ:
  850.  
  851.  move.l LINKFILE,a3
  852.  lea ObjectDefAnims(a3),a3
  853.  moveq #0,d0
  854.  move.b TypeOfThing(a0),d0
  855.  muls #O_AnimSize,d0
  856.  add.w d0,a3
  857.  move.w ObjTimer(a0),d0
  858.  
  859.  move.w d0,d1
  860.  add.w d0,d0
  861.  asl.w #2,d1
  862.  add.w d1,d0    ;*6
  863.  
  864.  cmp.w #1,O_GFXType(a2)
  865.  blt.s .bitmap
  866.  beq.s .vector
  867.  
  868. .glare:
  869.  move.l #0,8(a0)
  870.  move.b (a3,d0.w),d1
  871.  ext.w d1
  872.  neg.w d1
  873.  move.w d1,8(a0)
  874.  move.b 1(a3,d0.w),11(a0)
  875.  move.w 2(a3,d0.w),6(a0)
  876.  
  877.  move.b 4(a3,d0.w),d1 
  878.  ext.w d1
  879.  add.w d1,d1
  880.  add.w d1,4(a0)
  881.  
  882.  moveq #0,d1
  883.  move.b 5(a3,d0.w),d1
  884.  move.w d1,ObjTimer(a0)
  885.  rts
  886.  
  887. .vector:
  888.  
  889.  move.l #0,8(a0)
  890.  move.b (a3,d0.w),9(a0)
  891.  move.b 1(a3,d0.w),11(a0)
  892.  
  893.  move.w #$ffff,6(a0)
  894.  move.b 4(a3,d0.w),d1 
  895.  ext.w d1
  896.  add.w d1,d1
  897.  add.w d1,4(a0)
  898.  move.w 2(a3,d0.w),d1
  899.  add.w d1,Facing(a0)
  900.  
  901.  moveq #0,d1
  902.  move.b 5(a3,d0.w),d1
  903.  move.w d1,ObjTimer(a0)
  904.  
  905.  rts
  906.  
  907. .bitmap:
  908.  
  909.  move.l #0,8(a0)
  910.  move.b (a3,d0.w),9(a0)
  911.  move.b 1(a3,d0.w),11(a0)
  912.  move.w 2(a3,d0.w),6(a0)
  913.  move.b 4(a3,d0.w),d1 
  914.  ext.w d1
  915.  add.w d1,d1
  916.  add.w d1,4(a0)
  917.  
  918.  moveq #0,d1
  919.  move.b 5(a3,d0.w),d1
  920.  move.w d1,ObjTimer(a0)
  921.  
  922.  rts
  923.  
  924. ACTANIMOBJ:
  925.  
  926.  move.l LINKFILE,a3
  927.  lea ObjectActAnims(a3),a3
  928.  moveq #0,d0
  929.  move.b TypeOfThing(a0),d0
  930.  muls #O_AnimSize,d0
  931.  add.w d0,a3
  932.  move.w ObjTimer(a0),d0
  933.  
  934.  move.w d0,d1
  935.  add.w d0,d0
  936.  asl.w #2,d1
  937.  add.w d1,d0    ;*6
  938.  
  939.  cmp.w #1,O_GFXType(a2)
  940.  blt.s .bitmap
  941.  beq.s .vector
  942.  
  943. .glare:
  944.  move.l #0,8(a0)
  945.  move.b (a3,d0.w),d1
  946.  ext.w d1
  947.  neg.w d1
  948.  move.w d1,8(a0)
  949.  move.b 1(a3,d0.w),11(a0)
  950.  move.w 2(a3,d0.w),6(a0)
  951.  
  952.  move.b 4(a3,d0.w),d1 
  953.  ext.w d1
  954.  add.w d1,d1
  955.  add.w d1,4(a0)
  956.  
  957.  moveq #0,d1
  958.  move.b 5(a3,d0.w),d1
  959.  move.w d1,ObjTimer(a0)
  960.  
  961.  rts
  962.  
  963. .vector:
  964.  move.l #0,8(a0)
  965.  move.b (a3,d0.w),9(a0)
  966.  move.b 1(a3,d0.w),11(a0)
  967.  move.w #$ffff,6(a0)
  968.  move.b 4(a3,d0.w),d1 
  969.  ext.w d1
  970.  add.w d1,d1
  971.  add.w d1,4(a0)
  972.  
  973.  move.w 2(a3,d0.w),d1
  974.  add.w d1,Facing(a0)
  975.  
  976.  moveq #0,d1
  977.  move.b 5(a3,d0.w),d1
  978.  move.w d1,ObjTimer(a0)
  979.  
  980.  rts
  981.  
  982. .bitmap:
  983.  
  984.  move.l #0,8(a0)
  985.  move.b (a3,d0.w),9(a0)
  986.  move.b 1(a3,d0.w),11(a0)
  987.  move.w 2(a3,d0.w),6(a0)
  988.  move.b 4(a3,d0.w),d1 
  989.  ext.w d1
  990.  add.w d1,d1
  991.  add.w d1,4(a0)
  992.  
  993.  moveq #0,d1
  994.  move.b 5(a3,d0.w),d1
  995.  move.w d1,ObjTimer(a0)
  996.  
  997.  rts
  998.  
  999.  
  1000. THISPLRxoff: dc.w 0
  1001. THISPLRzoff: dc.w 0
  1002.  
  1003. ViewpointToDraw:
  1004. ; Calculate which side to display:
  1005.  
  1006. ; move.l ObjectPoints,a1
  1007. ; move.w (a0),d1
  1008. ; lea (a1,d1.w*8),a1    ; ptr to points 
  1009.  
  1010. ; move.w (a1),oldx
  1011. ; move.w 4(a1),oldz
  1012. ; move.w THISPLRxoff,newx
  1013. ; move.w THISPLRzoff,newz
  1014. ; move.w #64,speed
  1015. ; move.w #-60,Range
  1016. ; movem.l a0/a1,-(a7)
  1017. ; jsr HeadTowards
  1018. ; movem.l (a7)+,a0/a1
  1019. ; move.w newx,d0
  1020. ; sub.w oldx,d0
  1021. ; move.w newz,d1
  1022. ; sub.w oldz,d1
  1023.  
  1024.  move.w Facing(a0),d3
  1025.  sub.w angpos,d3 
  1026.  
  1027. ; add.w #2048,d3
  1028.  and.w #8190,d3
  1029.  move.l #SineTable,a2
  1030.  move.w (a2,d3.w),d2
  1031.  adda.w #2048,a2
  1032.  move.w (a2,d3.w),d3
  1033.  
  1034. ; move.w d0,d4
  1035. ; move.w d1,d5
  1036. ; muls d3,d4
  1037. ; muls d2,d5
  1038. ; sub.l d5,d4
  1039. ; muls d3,d1
  1040. ; muls d2,d0
  1041. ; add.l d1,d0
  1042.  
  1043.  ext.l d2
  1044.  ext.l d3
  1045.  move.l d3,d0
  1046.  move.l d2,d4
  1047.  neg.l d0
  1048.  
  1049.  tst.l d0
  1050.  bgt.s FacingTowardsPlayer
  1051. FAP:
  1052.  tst.l d4
  1053.  bgt.s FAPR
  1054.  cmp.l d4,d0
  1055.  bgt.s LEFTFRAME
  1056.  bra.s AWAYFRAME
  1057.  
  1058. FAPR:
  1059.  neg.l d0
  1060.  cmp.l d0,d4
  1061.  bgt.s RIGHTFRAME
  1062.  bra.s AWAYFRAME
  1063.  
  1064. FacingTowardsPlayer
  1065.  
  1066.  tst.l d4
  1067.  bgt.s FTPR
  1068.  neg.l d4
  1069.  cmp.l d0,d4
  1070.  bgt.s LEFTFRAME
  1071.  bra.s TOWARDSFRAME
  1072.  
  1073. FTPR:
  1074.  cmp.l d0,d4
  1075.  bgt.s RIGHTFRAME
  1076. TOWARDSFRAME:
  1077.  move.l #0,d0
  1078.  rts
  1079. RIGHTFRAME:
  1080.  move.l #1,d0
  1081.  rts
  1082. LEFTFRAME:
  1083.  move.l #3,d0
  1084.  rts
  1085. AWAYFRAME:
  1086.  move.l #2,d0
  1087.  rts
  1088.  
  1089. deadframe: dc.l 0
  1090. screamsound: dc.w 0
  1091. nasheight: dc.w 0
  1092. tempcos: dc.w 0
  1093. tempsin: dc.w 0
  1094. tempx: dc.w 0
  1095. tempz: dc.w 0
  1096.  
  1097. RunAround:
  1098.  
  1099.  movem.l d0/d1/d2/d3/a0/a1,-(a7)
  1100.  
  1101.  move.w oldx,d0
  1102.  sub.w newx,d0    ; dx
  1103.  asr.w #1,d0
  1104.  move.w oldz,d1
  1105.  sub.w newz,d1    ; dz
  1106.  asr.w #1,d1
  1107.  
  1108.  move.l ObjectPoints,a1
  1109.  move.w (a0),d2
  1110.  lea (a1,d2.w*8),a1
  1111.  move.w (a1),d2
  1112.  sub.w tempx,d2
  1113.  move.w 4(a1),d3
  1114.  sub.w tempz,d3
  1115.  
  1116.  muls tempcos,d2
  1117.  muls tempsin,d3
  1118.  sub.l d3,d2
  1119.  
  1120.  blt.s headleft
  1121.  neg.w d0
  1122.  neg.w d1
  1123. headleft:
  1124.  sub.w d1,newx
  1125.  add.w d0,newz
  1126.  
  1127.  movem.l (a7)+,d0/d1/d2/d3/a0/a1
  1128.  rts
  1129.  
  1130. bbbb: dc.w 0
  1131. tsx: dc.w 0
  1132. tsz: dc.w 0
  1133. fsx: dc.w 0
  1134. fsz: dc.w 0
  1135.  
  1136. SHOOTPLAYER1
  1137.  
  1138.  
  1139.  move.w oldx,tsx
  1140.  move.w oldz,tsz
  1141.  move.w newx,fsx
  1142.  move.w newz,fsz
  1143.  
  1144.  move.w p1_xoff,newx
  1145.  move.w p1_zoff,newz
  1146.  move.w (a1),oldx
  1147.  move.w 4(a1),oldz
  1148.  
  1149.  move.w newx,d1
  1150.  sub.w oldx,d1
  1151.  move.w newz,d2
  1152.  sub.w oldz,d2
  1153.  jsr GetRand
  1154.  asr.w #4,d0
  1155.  muls d0,d1
  1156.  muls d0,d2
  1157.  swap d1
  1158.  swap d2
  1159.  add.w d1,newz
  1160.  sub.w d2,newx
  1161.  
  1162.  move.l p1_yoff,d1
  1163.  add.l #15*128,d1
  1164.  asr.l #7,d1
  1165.  move.w d1,d2
  1166.  muls d0,d2
  1167.  swap d2
  1168.  add.w d2,d1
  1169.  ext.l d1
  1170.  asl.l #7,d1
  1171.  move.l d1,newy
  1172.  move.w 4(a0),d1
  1173.  ext.l d1
  1174.  asl.l #7,d1
  1175.  move.l d1,oldy
  1176.  
  1177.  move.b ObjInTop(a0),StoodInTop
  1178.  
  1179.  st exitfirst
  1180.  move.w #0,extlen
  1181.  move.b #$ff,awayfromwall
  1182.  move.w #%0000010000000000,wallflags
  1183.  move.l #0,StepUpVal
  1184.  move.l #$1000000,StepDownVal
  1185.  move.l #0,thingheight
  1186.  move.l objroom,-(a7)
  1187.  movem.l d0-d7/a0-a6,-(a7)
  1188.  
  1189. .again:
  1190.  jsr MoveObject
  1191.  tst.b hitwall
  1192.  bne.s .nofurther
  1193.  move.w newx,d0
  1194.  sub.w oldx,d0
  1195.  add.w d0,oldx
  1196.  add.w d0,newx
  1197.  move.w newz,d0
  1198.  sub.w oldz,d0
  1199.  add.w d0,oldz
  1200.  add.w d0,newz
  1201.  move.l newy,d0
  1202.  sub.l oldy,d0
  1203.  add.l d0,oldy
  1204.  add.l d0,newy
  1205.  bra .again
  1206.  
  1207. .nofurther:
  1208.  
  1209.  move.l objroom,backroom
  1210.  
  1211.  movem.l (a7)+,d0-d7/a0-a6
  1212.  move.l (a7)+,objroom
  1213.  
  1214.  move.l PlayerShotData,a0
  1215.  move.w #19,d1
  1216. .findonefree2
  1217.  move.w 12(a0),d2
  1218.  blt.s .foundonefree2
  1219.  adda.w #64,a0
  1220.  dbra d1,.findonefree2
  1221.  
  1222.  move.w tsx,oldx
  1223.  move.w tsz,oldz
  1224.  move.w fsx,newx
  1225.  move.w fsz,newz
  1226.  
  1227.  rts
  1228.  
  1229. .foundonefree2:
  1230.  
  1231.  move.l ObjectPoints,a1
  1232.  move.w (a0),d2
  1233.  move.w newx,(a1,d2.w*8)
  1234.  move.w newz,4(a1,d2.w*8)
  1235.  move.b #1,shotstatus(a0)
  1236.  move.w #0,shotgrav(a0)
  1237.  move.b #0,shotsize(a0)
  1238.  move.b #0,shotanim(a0)
  1239.  
  1240.  move.l backroom,a1
  1241.  move.w (a1),12(a0)
  1242.  st worry(a0)
  1243.  move.l wallhitheight,d0
  1244.  move.l d0,accypos(a0)
  1245.  asr.l #7,d0
  1246.  move.w d0,4(a0)
  1247.  
  1248.  move.w tsx,oldx
  1249.  move.w tsz,oldz
  1250.  move.w fsx,newx
  1251.  move.w fsz,newz
  1252.  
  1253.  
  1254.  rts
  1255.  
  1256. futurex: dc.w 0
  1257. futurez: dc.w 0
  1258.  
  1259. FireAtPlayer1:
  1260.  
  1261.  move.l ObjectPoints,a1
  1262.  move.w (a0),d1
  1263.  lea (a1,d1.w*8),a1
  1264.  
  1265.  move.l NastyShotData,a5
  1266.  move.w #19,d1
  1267. .findonefree
  1268.  move.w 12(a5),d0
  1269.  blt.s .foundonefree
  1270.  adda.w #64,a5
  1271.  dbra d1,.findonefree
  1272.  
  1273.  bra .cantshoot
  1274.  
  1275. .foundonefree:
  1276.  
  1277.  move.b #2,16(a5)
  1278.  
  1279.  move.l #ObjRotated,a6
  1280.  move.w (a0),d0
  1281.  lea (a6,d0.w*8),a6
  1282.  
  1283.  move.l (a6),Noisex
  1284.  move.w #100,Noisevol
  1285.  move.b #1,chanpick
  1286.  clr.b notifplaying
  1287.  move.b SHOTTYPE,d0
  1288.  move.w #0,shotlife(a5)
  1289.  move.b d0,shotsize(a5)
  1290.  move.b ALIENECHO,Echo
  1291.  move.b SHOTPOWER,shotpower(a5)
  1292.  movem.l a5/a1/a0,-(a7)
  1293.  move.w (a0),IDNUM
  1294.  jsr MakeSomeNoise
  1295.  movem.l (a7)+,a5/a1/a0
  1296.  
  1297.  move.l ObjectPoints,a2
  1298.  move.w (a5),d1
  1299.  lea (a2,d1.w*8),a2
  1300.  move.w (a1),oldx
  1301.  move.w 4(a1),oldz
  1302.  move.w PLR1_xoff,newx
  1303.  move.w PLR1_zoff,newz
  1304.  
  1305.  jsr CalcDist
  1306.  move.w XDIFF1,d6
  1307.  muls distaway,d6
  1308.  divs SHOTSPEED,d6
  1309.  asr.w #4,d6
  1310.  add.w d6,newx
  1311.  move.w ZDIFF1,d6
  1312.  muls distaway,d6
  1313.  divs SHOTSPEED,d6
  1314.  asr.w #4,d6
  1315.  add.w d6,newz
  1316.  move.w newx,futurex
  1317.  move.w newz,futurez
  1318.  
  1319.  move.w SHOTSPEED,speed
  1320.  move.w #0,Range
  1321.  jsr HeadTowards
  1322.  
  1323.  move.w newx,d0
  1324.  sub.w oldx,d0
  1325.  move.w newz,d1
  1326.  sub.w oldz,d1
  1327.  move.w SHOTOFFMULT,d2
  1328.  beq.s .nooffset
  1329.  
  1330.  muls d2,d0
  1331.  muls d2,d1
  1332.  asr.l #8,d0
  1333.  asr.l #8,d1
  1334.  add.w d1,oldx
  1335.  sub.w d0,oldz
  1336.  move.w futurex,newx
  1337.  move.w futurez,newz
  1338.  jsr HeadTowards
  1339.  
  1340. .nooffset:
  1341.  
  1342.  move.w newx,d0
  1343.  move.w d0,(a2)
  1344.  sub.w oldx,d0
  1345.  move.w d0,shotxvel(a5)
  1346.  move.w newz,d0
  1347.  move.w d0,4(a2)
  1348.  sub.w oldz,d0
  1349.  move.w d0,shotzvel(a5)
  1350.  
  1351.  move.l #%110010,EnemyFlags(a5)
  1352.  move.w 12(a0),12(a5)
  1353.  move.w 4(a0),d0
  1354.  move.w d0,4(a5)
  1355.  ext.l d0
  1356.  asl.l #7,d0
  1357.  add.l SHOTYOFF,d0
  1358.  move.l d0,accypos(a5)
  1359.  move.b SHOTINTOP,ObjInTop(a5)
  1360.  move.l PLR1_Obj,a2
  1361.  move.w 4(a2),d1
  1362.  sub.w #20,d1
  1363.  ext.l d1
  1364.  asl.l #7,d1
  1365.  sub.l d0,d1
  1366.  add.l d1,d1
  1367.  move.w distaway,d0 
  1368.   
  1369.  move.w SHOTSHIFT,d2
  1370.  asr.w d2,d0
  1371.  tst.w d0
  1372.  bgt.s .okokokok
  1373.  moveq #1,d0
  1374. .okokokok
  1375.  
  1376.  divs d0,d1
  1377.  move.w d1,shotyvel(a5)
  1378.  st worry(a5)
  1379.  
  1380.  move.l GunData,a6
  1381.  moveq #0,d0
  1382.  move.b SHOTTYPE,d0 
  1383.  asl.w #5,d0
  1384.  add.w d0,a6
  1385.  move.w 16(a6),shotgrav(a5)
  1386.  move.w 18(a6),shotflags(a5)
  1387. ; move.w 20(a6),d0
  1388. ; add.w d0,shotyvel(a5)
  1389.  
  1390. .cantshoot
  1391.  rts
  1392.  
  1393.  
  1394. SHOOTPLAYER2
  1395.  
  1396.  move.w oldx,tsx
  1397.  move.w oldz,tsz
  1398.  move.w newx,fsx
  1399.  move.w oldx,fsz
  1400.  
  1401.  move.w p2_xoff,newx
  1402.  move.w p2_zoff,newz
  1403.  move.w (a1),oldx
  1404.  move.w 4(a1),oldz
  1405.  
  1406.  move.w newx,d1
  1407.  sub.w oldx,d1
  1408.  move.w newz,d2
  1409.  sub.w oldz,d2
  1410.  jsr GetRand
  1411.  asr.w #4,d0
  1412.  muls d0,d1
  1413.  muls d0,d2
  1414.  swap d1
  1415.  swap d2
  1416.  add.w d1,newz
  1417.  sub.w d2,newx
  1418.  
  1419.  move.l p2_yoff,d1
  1420.  add.l #15*128,d1
  1421.  asr.l #7,d1
  1422.  move.w d1,d2
  1423.  muls d0,d2
  1424.  swap d2
  1425.  add.w d2,d1
  1426.  ext.l d1
  1427.  asl.l #7,d1
  1428.  move.l d1,newy
  1429.  move.w 4(a0),d1
  1430.  ext.l d1
  1431.  asl.l #7,d1
  1432.  move.l d1,oldy
  1433.  move.b ObjInTop(a0),StoodInTop
  1434.  
  1435.  st exitfirst
  1436.  move.w #0,extlen
  1437.  move.b #$ff,awayfromwall
  1438.  move.w #%0000010000000000,wallflags
  1439.  move.l #0,StepUpVal
  1440.  move.l #$1000000,StepDownVal
  1441.  move.l #0,thingheight
  1442.  move.l objroom,-(a7)
  1443.  movem.l d0-d7/a0-a6,-(a7)
  1444.  
  1445. .again:
  1446.  jsr MoveObject
  1447.  tst.b hitwall
  1448.  bne.s .nofurther
  1449.  move.w newx,d0
  1450.  sub.w oldx,d0
  1451.  add.w d0,oldx
  1452.  add.w d0,newx
  1453.  move.w newz,d0
  1454.  sub.w oldz,d0
  1455.  add.w d0,oldz
  1456.  add.w d0,newz
  1457.  move.l newy,d0
  1458.  sub.l oldy,d0
  1459.  add.l d0,oldy
  1460.  add.l d0,newy
  1461.  bra .again
  1462.  
  1463. .nofurther:
  1464.  
  1465.  move.l objroom,backroom
  1466.  
  1467.  movem.l (a7)+,d0-d7/a0-a6
  1468.  move.l (a7)+,objroom
  1469.  
  1470.  move.l NastyShotData,a0
  1471.  move.w #19,d1
  1472. .findonefree2
  1473.  move.w 12(a0),d2
  1474.  blt.s .foundonefree2
  1475.  adda.w #64,a0
  1476.  dbra d1,.findonefree2
  1477.  
  1478.  move.w tsx,oldx
  1479.  move.w tsz,oldz
  1480.  move.w fsx,newx
  1481.  move.w fsz,oldx
  1482.  
  1483.  rts
  1484.  
  1485. .foundonefree2:
  1486.  
  1487.  move.l ObjectPoints,a1
  1488.  move.w (a0),d2
  1489.  move.w newx,(a1,d2.w*8)
  1490.  move.w newz,4(a1,d2.w*8)
  1491.  move.b #1,shotstatus(a0)
  1492.  move.w #0,shotgrav(a0)
  1493.  move.b #0,shotsize(a0)
  1494.  move.b #0,shotanim(a0)
  1495.  
  1496.  move.l backroom,a1
  1497.  move.w (a1),12(a0)
  1498.  st worry(a0)
  1499.  move.l wallhitheight,d0
  1500.  move.l d0,accypos(a0)
  1501.  asr.l #7,d0
  1502.  move.w d0,4(a0)
  1503.  
  1504.  move.w tsx,oldx
  1505.  move.w tsz,oldz
  1506.  move.w fsx,newx
  1507.  move.w fsz,oldx
  1508.  
  1509.  rts
  1510.  
  1511. FireAtPlayer2:
  1512.  move.l NastyShotData,a5
  1513.  move.w #19,d1
  1514. .findonefree
  1515.  move.w 12(a5),d0
  1516.  blt.s .foundonefree
  1517.  adda.w #64,a5
  1518.  dbra d1,.findonefree
  1519.  
  1520.  bra .cantshoot
  1521.  
  1522. .foundonefree:
  1523.  
  1524.  move.b #2,16(a5)
  1525.  
  1526.  move.l #ObjRotated,a6
  1527.  move.w (a0),d0
  1528.  lea (a6,d0.w*8),a6
  1529.  
  1530.  move.l (a6),Noisex
  1531.  move.w #100,Noisevol
  1532.  move.b #1,chanpick
  1533.  clr.b notifplaying
  1534.  move.b SHOTPOWER,d0
  1535.  move.w #0,shotlife(a5)
  1536.  move.b d0,shotsize(a5)
  1537.  move.b SHOTPOWER,shotpower(a5)
  1538.  movem.l a5/a1/a0,-(a7)
  1539.  move.w (a0),IDNUM
  1540.  move.b ALIENECHO,Echo
  1541.  jsr MakeSomeNoise
  1542.  movem.l (a7)+,a5/a1/a0
  1543.  
  1544.  move.l ObjectPoints,a2
  1545.  move.w (a5),d1
  1546.  lea (a2,d1.w*8),a2
  1547.  move.w (a1),oldx
  1548.  move.w 4(a1),oldz
  1549.  move.w PLR2_xoff,newx
  1550.  move.w PLR2_zoff,newz
  1551.  move.w SHOTSPEED,speed
  1552.  move.w #0,Range
  1553.  jsr HeadTowards
  1554.  
  1555.  move.w newx,d0
  1556.  sub.w oldx,d0
  1557.  move.w newz,d1
  1558.  sub.w oldz,d1
  1559.  move.w SHOTOFFMULT,d2
  1560.  beq.s .nooffset
  1561.  
  1562.  muls d2,d0
  1563.  muls d2,d1
  1564.  asr.l #8,d0
  1565.  asr.l #8,d1
  1566.  add.w d1,oldx
  1567.  sub.w d0,oldz
  1568.  move.w PLR2_xoff,newx
  1569.  move.w PLR2_zoff,newz
  1570.  jsr HeadTowards
  1571.  
  1572. .nooffset:
  1573.  
  1574.  
  1575.  move.w newx,d0
  1576.  move.w d0,(a2)
  1577.  sub.w oldx,d0
  1578.  move.w d0,shotxvel(a5)
  1579.  move.w newz,d0
  1580.  move.w d0,4(a2)
  1581.  sub.w oldz,d0
  1582.  move.w d0,shotzvel(a5)
  1583.  
  1584.  move.l #%110010,EnemyFlags(a5)
  1585.  move.w 12(a0),12(a5)
  1586.  move.w 4(a0),d0
  1587.  move.w d0,4(a5)
  1588.  ext.l d0
  1589.  asl.l #7,d0
  1590.  add.l SHOTYOFF,d0
  1591.  move.l d0,accypos(a5)
  1592.  move.b SHOTINTOP,ObjInTop(a5)
  1593.  move.l PLR2_Obj,a2
  1594.  move.w 4(a2),d1
  1595.  sub.w #20,d1
  1596.  ext.l d1
  1597.  asl.l #7,d1
  1598.  sub.l d0,d1
  1599.  add.l d1,d1
  1600.  move.w distaway,d0
  1601.  move.w SHOTSHIFT,d2
  1602.  asr.w d2,d0
  1603.  tst.w d0
  1604.  bgt.s .okokokok
  1605.  moveq #1,d0
  1606. .okokokok
  1607.  divs d0,d1
  1608.  move.w d1,shotyvel(a5)
  1609.  st worry(a5)
  1610.  move.w #0,shotgrav(a5)
  1611. .cantshoot
  1612.  rts
  1613.  
  1614. SHOTYOFF: dc.l 0
  1615. SHOTTYPE: dc.w 0
  1616. SHOTPOWER: dc.w 0
  1617. SHOTSPEED: dc.w 0
  1618. SHOTOFFMULT: dc.w 0
  1619. SHOTSHIFT: dc.w 0
  1620. SHOTINTOP: dc.w 0
  1621.  
  1622. backroom: dc.l 0